# -*- coding:utf-8 -*-
"""
@Time:  2024/6/15 19:02
@Auth:  Mrs.Gou 
@Function:  排序库(模块化封装）
"""
import time

from class06.demo01 import my_time_new

count = 0


@my_time_new()
def mao_pao(height):
    """冒泡排序"""
    global count
    count += 1
    # 对剩下的元素，重复第一步比较，轮次也是比元素少一次
    for j in range(len(height) - 1):
        # 再对剩下的所有元素
        # 两两比较，比元素少一次
        # 因为每一轮都少比较一个，所以-j
        for i in range(len(height) - 1 - j):
            if height[i] > height[i + 1]:
                # 如果顺序错误就进行交换
                height[i], height[i + 1] = height[i + 1], height[i]
    # print(height)


@my_time_new()
def xuan_ze(height):
    """选择排序"""
    # 对剩下的元素，重复第一步比较，轮次也是比元素少一次
    for j in range(len(height) - 1):
        # 第一个为标准
        base = 0
        # 每一轮选出最大，最小的就放到末尾
        # 因为第一个是标准，所以下标从1开始
        # 每一轮比较，都要少比较一个元素，所以-j
        for i in range(1, len(height) - j):
            if height[i] > height[base]:
                base = i
        # 放到末尾（每一轮的末尾都会多一个元素）
        height[base], height[len(height) - 1 - j] = height[len(height) - 1 - j], height[base]
    # print(height)


def q_sort(height: list, left: int, right: int):
    """
    快排
    分析
    :param height: 因为传地址
    :param left: 因为递归的时候，需要知道左边和右边
    :param right:
    :return:
    """

    # 找元素的两个指针
    l, h = left, right
    # 选取最右边的一个为基准
    base = height[h]

    while l < h:
        while l < h:
            # 从左往右找比基准大的，交换到h位置
            if height[l] > base:
                height[l], height[h] = height[h], height[l]
                h -= 1
                # 找到后停止，要交换方向
                break
            else:
                # 如果没找到，继续找
                l += 1

        while l < h:
            # 再从h位置从右往左找比基准小的，交换到之前l的位置
            if height[h] < base:
                height[l], height[h] = height[h], height[l]
                l += 1
                # 找到后停止，要交换方向
                break
            else:
                # 如果没找到，继续找
                h -= 1
    # 左边至少还有两个元素，才递归
    if l - left > 1:
        q_sort(height, left, l - 1)
    # 右边至少还有两个元素，才递归
    if right - h > 1:
        q_sort(height, h + 1, right)


# 调用
# height = [155, 187, 172, 160, 163, 166, 173, 182, 165, 159]
# mao_pao(height)
# xuan_ze(height)
# q_sort(height, 0, len(height) - 1)
# print(height)

if __name__ == '__main__':
    l = [i for i in range(2000, 0, -1)]
    t1 = time.time()
    mao_pao(l)
    print(time.time() - t1)

    # l = [i for i in range(2000, 0, -1)]
    # t1 = time.time()
    # xuan_ze(l)
    # print(time.time() - t1)
    #
    # import sys
    #
    # sys.setrecursionlimit(10 ** 6)
    # l = [i for i in range(2000, 0, -1)]
    # t1 = time.time()
    # q_sort(l, 0, len(l) - 1)
    # print(time.time() - t1)
